package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
	"strings"
	"time"

	"github.com/mark3labs/mcp-go/server"
)

func main() {
	// 从环境变量获取 Kubernetes 配置
	config := K8sConfig{
		KubeconfigPath: getEnvOrDefault("KUBECONFIG", ""),
		Namespace:      getEnvOrDefault("K8S_NAMESPACE", "default"),
		Context:        getEnvOrDefault("K8S_CONTEXT", ""),
		Timeout:        getDurationEnv("K8S_TIMEOUT", 30*time.Second),
	}

	// 创建 K8s MCP 服务器
	k8sServer, err := NewK8sMCPServer(config)
	if err != nil {
		log.Fatalf("创建 K8s MCP 服务器失败: %v", err)
	}

	// 创建 MCP 服务器
	s := server.NewMCPServer(
		"Kubernetes MCP Server",
		"1.0.0",
		server.WithToolCapabilities(true),
		server.WithRecovery(),
	)

	// 注册 K8s 工具
	k8sServer.RegisterTools(s)

	// 获取服务器模式
	serverMode := getEnvOrDefault("SERVER_MODE", "stdio")

	// 根据模式启动服务器
	switch strings.ToLower(serverMode) {
	case "stdio":
		log.Println("启动 Kubernetes MCP 服务器 (stdio模式)...")
		if err := server.ServeStdio(s); err != nil {
			log.Fatalf("stdio服务器错误: %v", err)
		}
	case "http":
		host := getEnvOrDefault("SERVER_HOST", "localhost")
		port := getEnvOrDefault("SERVER_PORT", "8080")
		addr := fmt.Sprintf("%s:%s", host, port)

		log.Printf("启动 Kubernetes MCP 服务器 (HTTP模式) on %s...", addr)

		// 创建可流式HTTP服务器
		httpServer := server.NewStreamableHTTPServer(s,
			server.WithEndpointPath("/mcp"),
			server.WithHeartbeatInterval(30*time.Second),
		)

		// 创建HTTP服务器
		srv := &http.Server{
			Addr:         addr,
			Handler:      httpServer,
			ReadTimeout:  30 * time.Second,
			WriteTimeout: 30 * time.Second,
			IdleTimeout:  60 * time.Second,
		}

		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("HTTP服务器错误: %v", err)
		}
	default:
		log.Fatalf("不支持的服务器模式: %s，支持的模式: stdio, http", serverMode)
	}
}

// 辅助函数
func getEnvOrDefault(key, defaultValue string) string {
	if value := os.Getenv(key); value != "" {
		return value
	}
	return defaultValue
}

func getDurationEnv(key string, defaultValue time.Duration) time.Duration {
	if value := os.Getenv(key); value != "" {
		if duration, err := time.ParseDuration(value); err == nil {
			return duration
		}
	}
	return defaultValue
}
